#ifndef ESTRATEGIARECURSO_H_
#define ESTRATEGIARECURSO_H_

#include "Dato.h"
#include "Clave.h"
#include "WrapperComponente.h"
#include "includes.h"
#include "Excepciones.h"

namespace Toolkit
{

class RecursoAlmacenamiento;

class EstrategiaRecurso
{

public:
    EstrategiaRecurso(const TipoSerializacion tserializacion, 
    		const unsigned long int &tamanoBloque, const bool &controlarUnicidad = true);
    virtual ~EstrategiaRecurso();
	
	/**
	 * Guarda el dato en el almacenamiento, verificando unicidad.
	 * Si la clave es duplicada se lanza una excepción. Si hay indice
	 * se lo actualiza. 
	 * */
    virtual void guardarDato(const Dato &dato, const Clave &clave) = 0;
    
    /**
     * Busca en el (o los) almacenmiento el dato con la clave dada. 
     * Si lo encuentra devuelve true y lo almacena en el dato pasado.
     * Si no lo encuentra, devuelve false.
     * */
    virtual bool recuperarDato(const Clave &clave, Dato &dato) = 0;
    
    /**
     * Se elimina de los almacenamientos el dato cuya clave es la especificada,
     * y se lo devuelve almacenado en el dato pasado.
     * Si no se encuentra en los almacenamientos, no se hace nada.
     * */
    virtual void eliminarDato(const Clave &clave, Dato &dato) = 0;
        
    /**
     * Reemplaza en los almacenamientos el dato cuya clave es especificada, 
     * por el nuevo dato pasado.
     * En caso de no encontrarse la clave, se la agrega en un nuevo registro.
     * */
    virtual void actualizarDato(const Dato &dato, const Clave &clave) = 0;

    RecursoAlmacenamiento* getRecurso() const;
    void setRecurso (RecursoAlmacenamiento* recurso);

    void setControlUnicidad(const bool& controlUnicidad);

    bool getControlUnicidad() const;



protected:
	/**
	 * Busca en el almacenamiento primario la clave dada, y guarda el dato en la
	 * variable pasada. Si se lo encuentra devuelve true.
	 * La posicion en que se lo encuentra se devuelve en posicion.
	 * La fabrica de componentes es configurada en el metodo.
	 * */
	bool buscarEnPrimario(const Clave &clave, Dato &dato, WrapperComponente &wrapper, unsigned long int &posicion);	
	bool buscarEnPrimario(const Clave &clave, Dato &dato, WrapperComponente &wrapper);
    TipoSerializacion tserializacion;

private:
    RecursoAlmacenamiento* recurso;
    unsigned long int tamanoBloque;
    bool controlarUnicidad;
};

}
#endif /* ESTRATEGIARECURSO_H_ */
